<?php

# -- DÉBUT NOTE DE LICENCE -------------------------------------
#
# Ce fichier fait partie de Clicpage.
#
# Copyright (c) 2010 Francois (www.clicpage.net)
# Distribué selon les termes de la licence GPL version 2.0.
# Consultez le fichier LICENCE ou
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
#
# -- FIN NOTE DE LICENCE ---------------------------------------

/**
@defgroup CP_THEMES	Thèmes
*/

/**
@ingroup CP_THEMES
@nosubgrouping
@brief Thème

Un thème fonctionne grâce à une instance de cpTheme.

cpTheme est responsable de:
- Gérer l'affichage d'une page sur la partie publique du site.
- Spécifier ses zone de gadgets à l'interface d'administration.

*/
class cpTheme
{
	
	

	
	
	protected $core;
	
	protected $page;
	private $identifiant;
	
	
	
	

	/// @name Initialisation
	//@{

	
	public function __construct($core)
	{
		$this->core =& $core;
	}
	
	
	public function setPage($page)
	{
		$this->page =& $page;
	}
	//@}
	
	
	
	

	/// @name Identifiant
	//@{
	
	
	/**
	Retourne l'identifiant du thème.
	
	@return	<b>string</b>
	*/
	public function getIdentifiant()
	{
		return $this->identifiant;
	}
	
	
	/**
	Définit l'identifiant du thème.
	
	Doit obligatoirement être appelée dans la méthode 
	__construct de chaque thème.

	@param	identifiant	<b>string</b>	Identifiant du thème
	*/
	public function setIdentifiant($identifiant)
	{
		$this->identifiant = $identifiant;
	}
	//@}
	
	
	
	
	
	/// @name Public
	//@{
	
	
	/**
	Envoie les headers de la page.
	*/
	public function envoyerHeaders()
	{
		header('Content-Type: text/html; charset=UTF-8');
	}


	/**
	Affiche la page.
	*/
	public function afficherPage()
	{
		
		global $_ctx;
		global $tpl;
		
		# --- cpContexte ---		
		$_ctx = new cpContexte();
		$_ctx->page = $this->page;
		$_ctx->categorie = $this->page->getCategorie();
		$_ctx->site = $this->core->site;
		$_ctx->core = $this->core;
		
		
		# --- Initialisation du moteur de templates ---
		$tpl = new cpTemplate(CP_CHEMIN_CACHE.'/', '$tpl', $this->core);
		
		
		# --- Fichier du thème à utiliser ---
		$f = $this->page->getFichierTheme();
		if(is_array($f))
		{
			foreach($f as $v)
			{
				if(file_exists(CP_CHEMIN_THEMES.'/'.path::clean($this->getIdentifiant()).'/'.path::clean($v).'.html')) {
					$fichier_theme = path::clean($v).'.html';
					break;
				}
			}
		}
		else {
			$fichier_theme = path::clean($f).'.html';
		}
		
		if(!file_exists(CP_CHEMIN_THEMES.'/'.path::clean($this->getIdentifiant()).'/'.$fichier_theme)) {
			throw new cpErreur(__('Le thème choisi ne possède pas les fichiers nécessaires pour afficher ce type de page.'), null, 652);
		}
		
		
		# --- Définir les balises de template ---
		$this->definirBalisesTemplate($tpl);
		
		
		# --- Compiler le template ---
		$tpl->setPath(CP_CHEMIN_THEMES.'/'.path::clean($this->getIdentifiant()), CP_CHEMIN_THEMES.'/pluralism');
		$tplFile = $tpl->getFile($fichier_theme);
		
		
		# --- Affichage ---
		ob_start();
		include($tplFile);
		ob_end_flush();
		
	}
	
	
	/**
	Définit les balises de template.
	(->setValue et ->setBlock, afin de définir les balises
	de template qui devront être transformées)
	
	@param	template	<b>template</b>	Instance de template
	*/
	public function definirBalisesTemplate($template)
	{
		$balisesTemplate = new cpBalisesTemplate($this->getIdentifiant(), $this->core);	
		$balisesTemplate->appliquer($template);
		
		# --COMPORTEMENT-- publicBalisesTemplate
		$this->core->executerComportement('publicBalisesTemplate', $template);
		
	}
	//@}
	
	
	
	

	/// @name Administration
	//@{
	
	
	/**
	Retourne les zones de gadgets.
	
	La valeur retournée doit ressembler à ceci:
	array(
		'En haut'	=> 'Menu situé en haut de la page',
		'À droite' 	=> 'Menu situé à droite de la page',
		'En bas'	=> 'Pied de page'
	);
	
	@return	<b>array</b>
	*/
	public function getZonesGadgets()
	{
		return array();
	}
	//@}
	
	
	

	
	/// @name Installation
	//@{
	
	
	/**
	Définit les gadgets par défaut du thème.
	*/
	public function gadgetsDefaut()
	{
		
	}
	
	
	/**
	Associe un gadget au thème. Cette méthode doit être appelée
	à l'intérieur de la méthode cpTheme::gadgetsDefaut.
	
	@param	zone	<b>string</b>	Zone dans laquelle placer le gadget
	@param	gadget	<b>string</b>	Identifiant du gadget
	@param	config	<b>string</b>	Informations sur la manière de configurer
									le gadget.
	*/
	protected function setGadget($zone, $gadget, $config=null)
	{
		
		$cur = $this->core->con->openCursor($this->core->prefix.'gadgets');
		$cur->gadget_inst_conditions = 'a:2:{s:9:"affichage";i:1;s:10:"conditions";a:0:{}}';
		
		switch($gadget):
		
			case menu:
				
				$cur->gadget_id			= 'menu';
				$cur->gadget_inst_titre	= __('Menu');
				
				switch($config):
				
					case principal:
						$cur->gadget_inst_data = 'a:1:{i:0;a:3:{s:4:"type";s:15:"liensConditions";s:10:"conditions";a:1:{i:0;a:4:{i:1;s:3:"and";i:2;s:6:"cat_id";i:3;s:1:"=";i:4;i:1;}}s:3:"tri";a:2:{i:0;s:10:"page_titre";i:1;s:3:"asc";}}}';	
					break;
					
					case actuel:
						$cur->gadget_inst_data = 'a:1:{i:0;a:3:{s:4:"type";s:15:"liensConditions";s:10:"conditions";a:1:{i:0;a:4:{i:1;s:3:"and";i:2;s:6:"cat_id";i:3;s:1:"=";i:4;i:1;}}s:3:"tri";a:2:{i:0;s:10:"page_titre";i:1;s:3:"asc";}}}';	
					break;
				
				endswitch;
				
			break;
			
			case recherche:
				
				$rs = $this->core->site->getPages(array(
					'page_generateur'	=> 'recherche',
					'page_statut'		=> CP_STATUT_ONLINE
				), CP_GET_RS);
				
				if($rs->isEmpty()) {
					return false;
				}
			
				$cur->gadget_id				= 'recherche';
				$cur->gadget_inst_titre		= __('Recherche');
				$cur->gadget_inst_data		= serialize(array(
					'page_id'			=> $rs->page_id
				));

			break;
			
			case tags:
				
				$rs = $this->core->site->getPages(array(
					'page_generateur'	=> 'tags',
					'page_statut'		=> CP_STATUT_ONLINE
				), CP_GET_RS);
				
				if($rs->isEmpty()) {
					return false;
				}
				
				$cur->gadget_id				= 'tags';
				$cur->gadget_inst_titre 	= __('Tags');
				$cur->gadget_inst_data		= serialize(array(
					'page_id'			=> $rs->page_id
				));
				
			break;
			
			default:
				throw new cpErreur(__('Donnée invalide'), null, 303);
			break;
		
		endswitch;
		
		$rs = $this->core->con->select(
			'SELECT MAX(gadget_inst_id) '.
			'FROM '.$this->core->prefix.'gadgets'
		);
		
		$cur->gadget_inst_id 		= (integer) $rs->f(0) + 1;
		$cur->theme_id				= $this->getIdentifiant();
		$cur->zone_id				= $zone;
		
		$cur->insert();
		
	}
	//@}
	
	
}

?>